namespace Digitalmes.Domain.Entities.Mes.Productions;

/// <summary>
/// 产品在工艺步骤上的执行记录。
/// </summary>
/// <remarks>工艺步骤数据只有在产品过站结束后才会产生，记录中包括重复过站数据。</remarks>
[SugarTable("prod_step_execution")]
public sealed class ProdStepExecution : EntityBase
{
    /// <summary>
    /// 关联的进站 Id。
    /// </summary>
    public long InboundId { get; set; }

    /// <summary>
    /// 关联的出站 Id。
    /// </summary>
    public long OutboundId { get; set; }

    /// <summary>
    /// 工艺步骤 Id
    /// </summary>
    public long StepId { get; set; }

    /// <summary>
    /// SN
    /// </summary>
    [NotNull]
    public string? Sn { get; set; }

    /// <summary>
    /// 产品 Id。
    /// </summary>
    public long ProductId { get; set; }

    /// <summary>
    /// 产品编码
    /// </summary>
    [NotNull]
    public string? ProductCode { get; set; }

    /// <summary>
    /// 工单号，没有则为空。
    /// </summary>
    [NotNull]
    public string? Wo { get; set; }

    /// <summary>
    /// 产线 Id。
    /// </summary>
    public long LineId { get; set; }

    /// <summary>
    /// 产线编号
    /// </summary>
    [NotNull]
    public string? LineCode { get; set; }

    /// <summary>
    /// 工艺路线Id
    /// </summary>
    public long RoutingId { get; set; }

    /// <summary>
    /// 工序 Id。没有则为 0。
    /// </summary>
    public long OperationId { get; set; }

    /// <summary>
    /// 工序编号。没有则为空。
    /// </summary>
    [NotNull]
    public string? OperationCode { get; set; }

    /// <summary>
    /// 工位 Id。
    /// </summary>
    public long WorkstationId { get; set; }

    /// <summary>
    /// 工位编号
    /// </summary>
    [NotNull]
    public string? WorkstationCode { get; set; }

    /// <summary>
    /// 进站时间
    /// </summary>
    public DateTime InboundTime { get; set; }

    /// <summary>
    /// 出站时间
    /// </summary>
    public DateTime OutboundTime { get; set; }

    /// <summary>
    /// 过站结果（1->OK，2->NG，3->强制OK，4->强制NG，5->报废）
    /// </summary>
    public PassEnum PassResult { get; set; }

    /// <summary>
    /// 用时 (单位：秒)。
    /// </summary>
    public double CycleTime { get; set; }

    /// <summary>
    /// 关联的返工单 Id，不存在则为 0。
    /// </summary>
    public long ReworkDocId { get; set; }

    /// <summary>
    /// 工艺步骤过程数据集合。
    /// </summary>
    [Navigate(NavigateType.OneToMany, nameof(ProdStepData.ExecutionId))]
    public List<ProdStepData>? Data { get; set; }

    /// <summary>
    /// 过站结果是否成功
    /// </summary>
    /// <returns></returns>
    public bool IsSuccess()
    {
        return PassResult is PassEnum.OK or PassEnum.ForceOK;
    }
}
